package main

import (
	"fmt"
	"strconv"
	"strings"
)

//演示字符串的常用函数

func main() {
	//1. 统计字符串的长度 利用内置函数len
	str1 := "hello中国"
	//结果是11，因为golang的utf-8编码，字母数字占1个字节，汉字3个自己
	fmt.Println("str1的长度(字节数)=", len(str1))
	//2.遍历字符串,注意需要用%c 若是%v 那么输出的是 utf-8编码数值
	//由于len是字节大小，导致这样遍历中文是不行的
	for i := 0; i < len(str1); i++ {
		fmt.Printf("字符=%c", str1[i])
	}
	//因此需要用切片
	str1Rune := []rune(str1)
	for i := 0; i < len(str1Rune); i++ {
		fmt.Printf("\n切片的字符:%c", str1Rune[i])
	}

	//3.字符串转整数
	n1, err := strconv.Atoi("12")
	if err != nil {
		fmt.Println("转换错误")
	}
	fmt.Println("\n转换后的值：", n1)

	//4.整数转字符串
	n2str := strconv.Itoa(15)
	fmt.Println("\n转换后的字符串：", n2str)

	//5.字符串转字节数组
	var bytes = []byte("aaahello golang")
	fmt.Println("bytes=", bytes)

	//6.字节数组转字符串
	var bytesStr = string([]byte{97, 98, 99})
	fmt.Println("bytesStr=", bytesStr)

	//7.10进制数字，转2、8、16进制字符串格式
	fmt.Println("10进制：", 10,
		"二进制:", strconv.FormatInt(10, 2),
		"8进制:", strconv.FormatInt(10, 8),
		"16进制：", strconv.FormatInt(10, 16))

	//8 查找子串是否在字符串中
	fmt.Println(strings.Contains("abc", "bc"))

	//9 统计一个字符串中有几个指定的子串
	fmt.Println(strings.Count("我爱C# 我爱Go", "爱"))

	//10 不区分大小写比较字符串
	//golang中  == 比较字符串是区分大小写的
	fmt.Println("abc" == "Abc")
	fmt.Println(strings.EqualFold("ABC", "abc"))

	//11 返回子串在字符串中第一次出现的位置 从0开始 无则为-1
	fmt.Println(strings.Index("ABC", "B"))

	//12 返回子串在字符串中最后一次次出现的位置 从0开始 无则为-1
	fmt.Println(strings.LastIndex("ABBC", "B")) //输出2

	//13 将指定的子串替换成令一个子串 最后的参数表示要替换几个，-1表示全部匹配的
	fmt.Println(strings.Replace("go go go hello", "go", "C#", 2))

	//14 按照指定的字符分割字符串
	splitStrArray := strings.Split("a,ab,c", ",")
	fmt.Println("splitStrArray=", splitStrArray)

	//16 大小写转换
	fmt.Println(strings.ToLower("GO"))
	fmt.Println(strings.ToUpper("go"))

	//17 去掉左右两边空格
	fmt.Println(strings.TrimSpace("  哈哈  "))

	//18 去掉左右两边指定字符
	fmt.Println(strings.Trim("!呵呵!", "!"))

	//19 判断是否以某字符开头或结尾
	fmt.Println(strings.HasPrefix("*呵呵", "*"))
}
